TypeScript const λ¨μΈμ κ°λ ₯ν λΆλ³ νμ μΆλ‘ κΈ°λ₯μ νμ©νμ¬ νλ‘μ νΈμ μ½λ μμ μ±κ³Ό μμΈ‘ κ°λ₯μ±μ ν₯μμν€μΈμ. μ€μ©μ μΈ μμ λ₯Ό ν΅ν΄ ν¨κ³Όμ μΈ μ¬μ©λ²μ λ°°μ보μΈμ.
TypeScript Const λ¨μΈ: κ²¬κ³ ν μ½λλ₯Ό μν λΆλ³ νμ μΆλ‘
JavaScriptμ μμ μ§ν©μΈ TypeScriptλ λμ μΈ μΉ κ°λ° μΈκ³μ μ μ νμ΄νμ λμ νμ΅λλ€. κ·Έ κ°λ ₯ν κΈ°λ₯ μ€ νλλ μ»΄νμΌλ¬κ° λ³μμ νμ μ μλμΌλ‘ μΆλ‘ νλ νμ μΆλ‘ μ λλ€. Const λ¨μΈμ TypeScript 3.4μ λμ λμ΄ νμ μΆλ‘ μ ν λ¨κ³ λ λ°μ μμΌ, λΆλ³μ±μ κ°μ νκ³ λ κ²¬κ³ νλ©° μμΈ‘ κ°λ₯ν μ½λλ₯Ό λ§λ€ μ μκ² ν΄μ€λλ€.
Const λ¨μΈμ΄λ 무μμΈκ°μ?
Const λ¨μΈμ TypeScript μ»΄νμΌλ¬μκ² μ΄λ€ κ°μ΄ λΆλ³μμ μλνλ€λ κ²μ μ리λ λ°©λ²μ
λλ€. 리ν°λ΄ κ°μ΄λ ννμ λ€μ as const
ꡬ문μ μ¬μ©νμ¬ μ μ©ν©λλ€. μ΄λ μ»΄νμΌλ¬μκ² ννμμ λν΄ κ°λ₯ν κ°μ₯ μ’μ(리ν°λ΄) νμ
μ μΆλ‘ νκ³ λͺ¨λ μμ±μ readonly
λ‘ νμνλλ‘ μ§μν©λλ€.
λ³Έμ§μ μΌλ‘ const λ¨μΈμ λ¨μν λ³μλ₯Ό const
λ‘ μ μΈνλ κ²λ³΄λ€ λ κ°λ ₯ν μμ€μ νμ
μμ μ±μ μ 곡ν©λλ€. const
λ λ³μ μ체μ μ¬ν λΉμ λ§μ§λ§, λ³μκ° μ°Έμ‘°νλ κ°μ²΄λ λ°°μ΄μ μμ μ λ§μ§λ μμ΅λλ€. Const λ¨μΈμ κ°μ²΄μ μμ± μμ λν λ°©μ§ν©λλ€.
Const λ¨μΈ μ¬μ©μ μ΄μ
- ν₯μλ νμ μμ μ±: λΆλ³μ±μ κ°μ ν¨μΌλ‘μ¨ const λ¨μΈμ λ°μ΄ν°μ μ°λ°μ μΈ μμ μ λ°©μ§νμ¬ λ°νμ μ€λ₯λ₯Ό μ€μ΄κ³ λ μ λ’°ν μ μλ μ½λλ₯Ό λ§λλλ€. μ΄λ λ°μ΄ν° 무결μ±μ΄ κ°μ₯ μ€μν 볡μ‘ν μ ν리μΌμ΄μ μμ νΉν μ€μν©λλ€.
- ν₯μλ μ½λ μμΈ‘ κ°λ₯μ±: κ°μ΄ λΆλ³μ΄λΌλ κ²μ μλ©΄ μ½λλ₯Ό μΆλ‘ νκΈ°κ° λ μ¬μμ§λλ€. κ°μ΄ μκΈ°μΉ μκ² λ³κ²½λμ§ μμ κ²μ΄λΌκ³ νμ ν μ μμ΄ λλ²κΉ λ° μ μ§ κ΄λ¦¬κ° λ¨μνλ©λλ€.
- κ°μ₯ μ’μ νμ μΆλ‘ : Const λ¨μΈμ μ»΄νμΌλ¬κ° κ°λ₯ν κ°μ₯ ꡬ체μ μΈ νμ μ μΆλ‘ νλλ‘ μ§μν©λλ€. μ΄λ₯Ό ν΅ν΄ λ μ λ°ν νμ κ²μ¬λ₯Ό μννκ³ λ κ³ κΈ νμ λ 벨 μ‘°μμ νμ±νν μ μμ΅λλ€.
- λ λμ μ±λ₯: κ²½μ°μ λ°λΌ κ°μ΄ λΆλ³μ΄λΌλ κ²μ μλ©΄ TypeScript μ»΄νμΌλ¬κ° μ½λλ₯Ό μ΅μ ννμ¬ μ μ¬μ μΌλ‘ μ±λ₯ ν₯μμ κ°μ Έμ¬ μ μμ΅λλ€.
- λͺ
νν μλ νν:
as const
λ₯Ό μ¬μ©νλ©΄ λΆλ³ λ°μ΄ν°λ₯Ό μμ±νλ €λ μλλ₯Ό λͺ μμ μΌλ‘ λνλ΄μ΄ λ€λ₯Έ κ°λ°μλ€μ΄ μ½λλ₯Ό λ μ½κ² μ½κ³ μ΄ν΄ν μ μκ² λ§λλλ€.
μ€μ©μ μΈ μμ
μμ 1: 리ν°λ΄ κΈ°λ³Έ μ¬μ©λ²
const λ¨μΈμ΄ μμΌλ©΄ TypeScriptλ message
μ νμ
μ string
μΌλ‘ μΆλ‘ ν©λλ€:
const message = "Hello, World!"; // νμ
: string
const λ¨μΈμ μ¬μ©νλ©΄ TypeScriptλ νμ
μ 리ν°λ΄ λ¬Έμμ΄ "Hello, World!"
λ‘ μΆλ‘ ν©λλ€:
const message = "Hello, World!" as const; // νμ
: "Hello, World!"
μ΄λ₯Ό ν΅ν΄ 리ν°λ΄ λ¬Έμμ΄ νμ μ λ μ λ°ν νμ μ μ λ° λΉκ΅μ μ¬μ©ν μ μμ΅λλ€.
μμ 2: λ°°μ΄κ³Ό ν¨κ» Const λ¨μΈ μ¬μ©νκΈ°
μμ λ°°μ΄μ μκ°ν΄ λ΄ μλ€:
const colors = ["red", "green", "blue"]; // νμ
: string[]
λ°°μ΄μ΄ const
λ‘ μ μΈλμλλΌλ μ¬μ ν κ·Έ μμλ₯Ό μμ ν μ μμ΅λλ€:
colors[0] = "purple"; // μ€λ₯ μμ
console.log(colors); // μΆλ ₯: ["purple", "green", "blue"]
const λ¨μΈμ μΆκ°νλ©΄ TypeScriptλ λ°°μ΄μ μ½κΈ° μ μ© λ¬Έμμ΄ ννλ‘ μΆλ‘ ν©λλ€:
const colors = ["red", "green", "blue"] as const; // νμ
: readonly ["red", "green", "blue"]
μ΄μ λ°°μ΄μ μμ νλ €κ³ νλ©΄ TypeScript μ€λ₯κ° λ°μν©λλ€:
// colors[0] = "purple"; // μ€λ₯: 'readonly ["red", "green", "blue"]' νμ
μ μΈλ±μ€ μκ·Έλμ²λ μ½κΈ°λ§ νμ©ν©λλ€.
μ΄κ²μ colors
λ°°μ΄μ΄ λΆλ³μΌλ‘ μ μ§λλλ‘ λ³΄μ₯ν©λλ€.
μμ 3: κ°μ²΄μ ν¨κ» Const λ¨μΈ μ¬μ©νκΈ°
λ°°μ΄κ³Ό μ μ¬νκ², κ°μ²΄λ const λ¨μΈμ μ¬μ©νμ¬ λΆλ³μΌλ‘ λ§λ€ μ μμ΅λλ€:
const person = {
name: "Alice",
age: 30,
}; // νμ
: { name: string; age: number; }
const
λ₯Ό μ¬μ©νλλΌλ person
κ°μ²΄μ μμ±μ μμ ν μ μμ΅λλ€:
person.age = 31; // μ€λ₯ μμ
console.log(person); // μΆλ ₯: { name: "Alice", age: 31 }
const λ¨μΈμ μΆκ°νλ©΄ κ°μ²΄μ μμ±μ΄ readonly
κ° λ©λλ€:
const person = {
name: "Alice",
age: 30,
} as const; // νμ
: { readonly name: "Alice"; readonly age: 30; }
μ΄μ κ°μ²΄λ₯Ό μμ νλ €κ³ νλ©΄ TypeScript μ€λ₯κ° λ°μν©λλ€:
// person.age = 31; // μ€λ₯: 'age'λ μ½κΈ° μ μ© μμ±μ΄λ―λ‘ ν λΉν μ μμ΅λλ€.
μμ 4: μ€μ²©λ κ°μ²΄ λ° λ°°μ΄κ³Ό ν¨κ» Const λ¨μΈ μ¬μ©νκΈ°
Const λ¨μΈμ μ€μ²©λ κ°μ²΄μ λ°°μ΄μ μ μ©νμ¬ κΉμ λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό λ§λ€ μ μμ΅λλ€. λ€μ μμ λ₯Ό κ³ λ €ν΄ λ³΄μΈμ:
const config = {
apiUrl: "https://api.example.com",
endpoints: {
users: "/users",
products: "/products",
},
supportedLanguages: ["en", "fr", "de"],
} as const;
// νμ
:
// {
// readonly apiUrl: "https://api.example.com";
// readonly endpoints: {
// readonly users: "/users";
// readonly products: "/products";
// };
// readonly supportedLanguages: readonly ["en", "fr", "de"];
// }
μ΄ μμ μμ config
κ°μ²΄, κ·Έ μμ μ€μ²©λ endpoints
κ°μ²΄, κ·Έλ¦¬κ³ supportedLanguages
λ°°μ΄μ λͺ¨λ readonly
λ‘ νμλ©λλ€. μ΄λ₯Ό ν΅ν΄ λ°νμμ ꡬμ±μ μ΄λ€ λΆλΆλ μ°λ°μ μΌλ‘ μμ λμ§ μλλ‘ λ³΄μ₯ν©λλ€.
μμ 5: ν¨μ λ°ν νμ κ³Ό ν¨κ» Const λ¨μΈ μ¬μ©νκΈ°
ν¨μκ° λΆλ³ κ°μ λ°ννλλ‘ λ³΄μ₯νκΈ° μν΄ const λ¨μΈμ μ¬μ©ν μ μμ΅λλ€. μ΄λ μ λ ₯μ μμ νκ±°λ κ°λ³ μΆλ ₯μ μμ±ν΄μλ μ λλ μ νΈλ¦¬ν° ν¨μλ₯Ό λ§λ€ λ νΉν μ μ©ν©λλ€.
function createImmutableArray(items: T[]): readonly T[] {
return [...items] as const;
}
const numbers = [1, 2, 3];
const immutableNumbers = createImmutableArray(numbers);
// immutableNumbersμ νμ
: readonly [1, 2, 3]
// immutableNumbers[0] = 4; // μ€λ₯: 'readonly [1, 2, 3]' νμ
μ μΈλ±μ€ μκ·Έλμ²λ μ½κΈ°λ§ νμ©ν©λλ€.
μ¬μ© μ¬λ‘ λ° μλ리μ€
κ΅¬μ± κ΄λ¦¬
Const λ¨μΈμ μ ν리μΌμ΄μ
ꡬμ±μ κ΄λ¦¬νλ λ° μ΄μμ μ
λλ€. κ΅¬μ± κ°μ²΄λ₯Ό as const
λ‘ μ μΈν¨μΌλ‘μ¨ μ ν리μΌμ΄μ
μλͺ
μ£ΌκΈ° λμ ꡬμ±μ΄ μΌκ΄λκ² μ μ§λλλ‘ λ³΄μ₯ν μ μμ΅λλ€. μ΄λ μκΈ°μΉ μμ λμμΌλ‘ μ΄μ΄μ§ μ μλ μ°λ°μ μΈ μμ μ λ°©μ§ν©λλ€.
const appConfig = {
appName: "My Application",
version: "1.0.0",
apiEndpoint: "https://api.example.com",
} as const;
μμ μ μ
Const λ¨μΈμ νΉμ 리ν°λ΄ νμ μΌλ‘ μμλ₯Ό μ μνλ λ°μλ μ μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ νμ μμ μ±κ³Ό μ½λ λͺ νμ±μ ν₯μμν¬ μ μμ΅λλ€.
const HTTP_STATUS_OK = 200 as const; // νμ
: 200
const HTTP_STATUS_NOT_FOUND = 404 as const; // νμ
: 404
Redux λλ κΈ°ν μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬μ ν¨κ» μ¬μ©νκΈ°
Reduxμ κ°μ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬μμ λΆλ³μ±μ ν΅μ¬ μμΉμ λλ€. Const λ¨μΈμ 리λμμ μ‘μ μμ±μμμ λΆλ³μ±μ κ°μ νμ¬ μ°λ°μ μΈ μν λ³μ΄λ₯Ό λ°©μ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
// Redux 리λμ μμ
interface State {
readonly count: number;
}
const initialState: State = { count: 0 } as const;
function reducer(state: State = initialState, action: { type: string }): State {
switch (action.type) {
default:
return state;
}
}
κ΅μ ν (i18n)
κ΅μ ν μμ μ ν λ, μ§μλλ μΈμ΄ μ§ν©κ³Ό ν΄λΉ λ‘μΌμΌ μ½λλ₯Ό κ°κ² λλ κ²½μ°κ° λ§μ΅λλ€. Const λ¨μΈμ μ΄ μ§ν©μ΄ λΆλ³μΌλ‘ μ μ§λλλ‘ λ³΄μ₯νμ¬ i18n ꡬνμ μμμν¬ μ μλ μ°λ°μ μΈ μΆκ°λ μμ μ λ°©μ§ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μμ΄(en), νλμ€μ΄(fr), λ μΌμ΄(de), μ€νμΈμ΄(es), μΌλ³Έμ΄(ja)λ₯Ό μ§μνλ€κ³ μμν΄ λ³΄μΈμ:
const supportedLanguages = ["en", "fr", "de", "es", "ja"] as const;
type SupportedLanguage = typeof supportedLanguages[number]; // νμ
: "en" | "fr" | "de" | "es" | "ja"
function greet(language: SupportedLanguage) {
switch (language) {
case "en":
return "Hello!";
case "fr":
return "Bonjour!";
case "de":
return "Guten Tag!";
case "es":
return "Β‘Hola!";
case "ja":
return "γγγ«γ‘γ―οΌ";
default:
return "Greeting not available for this language.";
}
}
μ ν μ¬ν λ° κ³ λ € μ¬ν
- μμ λΆλ³μ±(Shallow Immutability): Const λ¨μΈμ μμ λΆλ³μ±λ§ μ 곡ν©λλ€. μ¦, κ°μ²΄μ μ€μ²©λ κ°μ²΄λ λ°°μ΄μ΄ ν¬ν¨λ κ²½μ°, ν΄λΉ μ€μ²© ꡬ쑰λ μλμΌλ‘ λΆλ³μ΄ λμ§ μμ΅λλ€. κΉμ λΆλ³μ±μ λ¬μ±νλ €λ©΄ λͺ¨λ μ€μ²© λ 벨μ μ¬κ·μ μΌλ‘ const λ¨μΈμ μ μ©ν΄μΌ ν©λλ€.
- λ°νμ λΆλ³μ±: Const λ¨μΈμ μ»΄νμΌ νμ κΈ°λ₯μ λλ€. λ°νμμμμ λΆλ³μ±μ 보μ₯νμ§λ μμ΅λλ€. JavaScript μ½λλ 리νλ μ μ΄λ νμ μΊμ€ν κ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ const λ¨μΈμΌλ‘ μ μΈλ κ°μ²΄μ μμ±μ μ¬μ ν μμ ν μ μμ΅λλ€. λ°λΌμ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ μλμ μΌλ‘ νμ μμ€ν μ μ°ννμ§ μλ κ²μ΄ μ€μν©λλ€.
- μ±λ₯ μ€λ²ν€λ: Const λ¨μΈμ΄ λλλ‘ μ±λ₯ ν₯μμ κ°μ Έμ¬ μ μμ§λ§, κ²½μ°μ λ°λΌ μ½κ°μ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μλ μμ΅λλ€. μ΄λ μ»΄νμΌλ¬κ° λ ꡬ체μ μΈ νμ μ μΆλ‘ ν΄μΌ νκΈ° λλ¬Έμ λλ€. κ·Έλ¬λ μ±λ₯ μν₯μ μΌλ°μ μΌλ‘ 무μν μ μλ μμ€μ λλ€.
- μ½λ 볡μ‘μ±: Const λ¨μΈμ κ³Όλνκ² μ¬μ©νλ©΄ μ½λκ° λ μ₯ν©ν΄μ§κ³ μ½κΈ° μ΄λ €μμ§ μ μμ΅λλ€. νμ μμ μ±κ³Ό μ½λ κ°λ μ± μ¬μ΄μ κ· νμ λ§μΆλ κ²μ΄ μ€μν©λλ€.
Const λ¨μΈμ λμ
Const λ¨μΈμ λΆλ³μ±μ κ°μ νλ κ°λ ₯ν λꡬμ΄μ§λ§, κ³ λ €ν μ μλ λ€λ₯Έ μ κ·Ό λ°©μλ μμ΅λλ€:
- Readonly νμ
:
Readonly
νμ μ νΈλ¦¬ν°λ₯Ό μ¬μ©νμ¬ κ°μ²΄μ λͺ¨λ μμ±μreadonly
λ‘ νμν μ μμ΅λλ€. μ΄λ const λ¨μΈκ³Ό μ μ¬ν μμ€μ λΆλ³μ±μ μ 곡νμ§λ§, κ°μ²΄μ νμ μ λͺ μμ μΌλ‘ μ μν΄μΌ ν©λλ€. - Deep Readonly νμ
: κΉμ λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μν΄ μ¬κ·μ μΈ
DeepReadonly
νμ μ νΈλ¦¬ν°λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄ μ νΈλ¦¬ν°λ μ€μ²©λ μμ±μ ν¬ν¨ν λͺ¨λ μμ±μreadonly
λ‘ νμν©λλ€. - Immutable.js: Immutable.jsλ JavaScriptλ₯Ό μν λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μ 곡νλ λΌμ΄λΈλ¬λ¦¬μ λλ€. const λ¨μΈλ³΄λ€ λ ν¬κ΄μ μΈ λΆλ³μ± μ κ·Ό λ°©μμ μ 곡νμ§λ§, μΈλΆ λΌμ΄λΈλ¬λ¦¬μ λν μμ‘΄μ±μ΄ μΆκ°λ©λλ€.
- `Object.freeze()`λ‘ κ°μ²΄ λκ²°νκΈ°: JavaScriptμμ `Object.freeze()`λ₯Ό μ¬μ©νμ¬ κΈ°μ‘΄ κ°μ²΄ μμ±μ μμ μ λ°©μ§ν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ λ°νμμ λΆλ³μ±μ κ°μ νλ λ°λ©΄, const λ¨μΈμ μ»΄νμΌ νμμ μλν©λλ€. κ·Έλ¬λ `Object.freeze()`λ μμ λΆλ³μ±λ§ μ 곡νλ©° μ±λ₯μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
λͺ¨λ² μ¬λ‘
- μ λ΅μ μΌλ‘ Const λ¨μΈ μ¬μ©νκΈ°: λͺ¨λ λ³μμ λ§Ήλͺ©μ μΌλ‘ const λ¨μΈμ μ μ©νμ§ λ§μΈμ. νμ μμ μ±κ³Ό μ½λ μμΈ‘ κ°λ₯μ±μ μν΄ λΆλ³μ±μ΄ μ€μν μν©μμ μ νμ μΌλ‘ μ¬μ©νμΈμ.
- κΉμ λΆλ³μ± κ³ λ €νκΈ°: κΉμ λΆλ³μ±μ 보μ₯ν΄μΌ νλ κ²½μ°, const λ¨μΈμ μ¬κ·μ μΌλ‘ μ¬μ©νκ±°λ Immutable.jsμ κ°μ λμμ μΈ μ κ·Ό λ°©μμ νμνμΈμ.
- νμ μμ μ±κ³Ό κ°λ μ±μ κ· ν λ§μΆκΈ°: νμ μμ μ±κ³Ό μ½λ κ°λ μ± μ¬μ΄μ κ· νμ μν΄ λ Έλ ₯νμΈμ. const λ¨μΈμ΄ μ½λλ₯Ό λ무 μ₯ν©νκ² λ§λ€κ±°λ μ΄ν΄νκΈ° μ΄λ ΅κ² λ§λ λ€λ©΄ κ³Όλν μ¬μ©μ νΌνμΈμ.
- μλ λ¬ΈμννκΈ°: νΉμ κ²½μ°μ const λ¨μΈμ μ¬μ©νλ μ΄μ λ₯Ό μ€λͺ νκΈ° μν΄ μ£Όμμ μ¬μ©νμΈμ. μ΄λ λ€λ₯Έ κ°λ°μλ€μ΄ μ½λλ₯Ό μ΄ν΄νκ³ μ€μλ‘ λΆλ³μ± μ μ½ μ‘°κ±΄μ μλ°νλ κ²μ λ°©μ§νλ λ° λμμ΄ λ©λλ€.
- λ€λ₯Έ λΆλ³μ± κΈ°μ κ³Ό κ²°ν©νκΈ°: Const λ¨μΈμ
Readonly
νμ λ° Immutable.jsμ κ°μ λ€λ₯Έ λΆλ³μ± κΈ°μ κ³Ό κ²°ν©νμ¬ κ²¬κ³ ν λΆλ³μ± μ λ΅μ μ립ν μ μμ΅λλ€.
κ²°λ‘
TypeScript const λ¨μΈμ μ½λμμ λΆλ³μ±μ κ°μ νκ³ νμ
μμ μ±μ ν₯μμν€λ λ° μ μ©ν λꡬμ
λλ€. as const
λ₯Ό μ¬μ©νμ¬ μ»΄νμΌλ¬μκ² κ°μ λν΄ κ°λ₯ν κ°μ₯ μ’μ νμ
μ μΆλ‘ νκ³ λͺ¨λ μμ±μ readonly
λ‘ νμνλλ‘ μ§μν μ μμ΅λλ€. μ΄λ μ°λ°μ μΈ μμ μ λ°©μ§νκ³ , μ½λ μμΈ‘ κ°λ₯μ±μ λμ΄λ©°, λ μ λ°ν νμ
κ²μ¬λ₯Ό κ°λ₯νκ² ν©λλ€. const λ¨μΈμλ λͺ κ°μ§ μ ν μ¬νμ΄ μμ§λ§, TypeScript μΈμ΄μ κ°λ ₯ν μΆκ° κΈ°λ₯μ΄λ©° μ ν리μΌμ΄μ
μ κ²¬κ³ μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
TypeScript νλ‘μ νΈμ const λ¨μΈμ μ λ΅μ μΌλ‘ ν΅ν©ν¨μΌλ‘μ¨ λ μ λ’°ν μ μκ³ μ μ§ κ΄λ¦¬κ° μ©μ΄νλ©° μμΈ‘ κ°λ₯ν μ½λλ₯Ό μμ±ν μ μμ΅λλ€. λΆλ³ νμ μΆλ‘ μ νμ λ°μλ€μ¬ μννΈμ¨μ΄ κ°λ° λ°©μμ ν λ¨κ³ λμ΄μ¬λ¦¬μΈμ.